VBA
VBA (Visual Basic for Applications) は Microsoft のプログラミング言語で、主に Microsoft Office スイート内のアプリケーション (Excel、Word、PowerPoint、Access など) のマクロ プログラミングに使用されます。VBA を使用すると、ユーザーはタスクを自動化し、これらのアプリケーションにカスタム機能を追加できます。
VBA の主な機能と目的は次のとおりです。
- プログラミング言語:VBA は Visual Basic 言語に基づいており、プログラミング言語の機能をサポートしています。これにより、ユーザーは条件、ループ、変数、関数、オブジェクト、クラス、モジュールを使用してコードを記述できます。
- 自動化:VBA を使用すると、反復的な業務を自動化できます。たとえば、Excel のワークシート データを処理したり、特定の条件に基づいてドキュメントを生成したりできます。
- ユーザー定義関数とマクロ:ユーザーは VBA を使用してカスタム関数とマクロを作成できます。これは、既存のアプリケーションの機能を拡張したり、特定の要件に合わせたソリューションを開発したりするのに役立ちます。
- イベント処理:VBA を使用すると、ユーザーはアプリケーションで発生するイベント (ボタンのクリック、ワークシートの変更など) を処理できるため、インタラクティブで応答性の高いアプリケーションを作成できます。
- マクロ記録:ユーザーは日常のタスクのアクションを記録して、自動的に編集できる VBA コードを生成できます。これにより、コードをすばやく生成できます。
- Access データベースプログラミング:VBA は、Microsoft Access などのアプリケーションでデータベースと対話するための機能を提供します。
VBA を使用するには、ユーザーは各 Microsoft Office アプリケーションに組み込まれている VBA エディターを使用してコードを記述および実行します。VBA は、ビジネス プロセスの自動化、レポート生成、データ処理、カスタム フォームおよび関数の実装など、さまざまなタスクに使用されます。VBA は強力ですが、VBA を使用するには、コードの記述とデバッグに慣れておく必要があります。
VBAへようこそ
MS Office 製品で VBA にアクセスするには、ALT + F11 キーを押すか、”開発者”タブに移動します。REST API リクエストを送信するために VBA に特別なインストールは必要ありません。
VBA での JSON
通常、ユーザーは VBA (Visual Basic for Applications) で JSON データを処理するために外部ライブラリの支援を必要とします。VBA 自体には、JSON を処理するための組み込み関数やライブラリはありません。JSON データの処理に外部ライブラリを使用するには、”VBA-JSON”などのライブラリを活用できます。次に、VBA で JSON データを処理する方法の概要を示します。
- VBA-JSONライブラリのインストール:VBA-JSON ライブラリは、JSON データを解析および生成するための関数を提供します。まず、このライブラリをダウンロードしてインストールする必要があります。VBA-JSON ライブラリは GitHub で入手でき、JsonConverter.bas ファイルをダウンロードして VBA プロジェクトに追加できます。GitHub - VBA-tools/VBA-JSON: JSON conversion and parsing for VBA
-
VBA プロジェクトにライブラリを追加: VBA-JSON から JsonConverter.bas ファイルを VBA プロジェクトに追加するには、次の手順に従います。
-
VBA プロジェクトを開き、”モジュール”タブを選択します。
-
”ファイル”メニューを選択し、”ファイルのインポート”をクリックします。
-
読み込む JsonConverter.bas ファイルを選択します。
-
-
VBA 参照の追加:JsonConverter.bas ファイルを利用するには、VBA の辞書データ型を早期バインディングとして使用する必要があります。そのためには、”Microsoft Scripting Runtime”への参照を追加する必要があります。
以下の手順に従います。
-
ツールメニューの参照を実行します。
-
”Microsoft Scripting Runtime”を見つけてチェックボックスをオンにし、”OK”をクリックします。
-
VBA - JSON
- JSONデータの解析
上記でインストールしたライブラリの ParseJson 関数を使用して、VBA で JSON データを解析できます。以下は JSON データを解析する例です。
Option Explicit
Sub jsonParsing()
'Convert to VBA data by parsing JSON string
Dim jsonData As String
Dim data As Scripting.Dictionary
jsonData = "{""name"": ""John"", ""age"": 30, ""city"": ""New York""}"
Set data = JsonConverter.ParseJson(jsonData)
'Print result
Debug.Print data("name") 'John
End Sub
- JSONデータの作成
VBA で VBA データを JSON に変換するには、ConvertToJson 関数を使用できます。以下は、VBA 辞書を JSON 文字列に変換する例です。
Option Explicit
Sub jsonParsing()
'Convert VBA dictionary to JSON string
Dim jsonData As String
Dim data As Scripting.Dictionary
Set data = New Dictionary
data.Add "name", "John"
data.Add "age", 30
data.Add "city", "New York"
jsonData = JsonConverter.ConvertToJson(data)
'Print result
Debug.Print (jsonData) '{"name":"John","age":30,"city":"New York"}
End Sub
Exercise Examples
VBA を使用して、長方形断面の単純な梁を作成する例を見てみましょう。
VBA の特性を考慮して、この例では Excel シートを使用します。
- まず、シートに変数を配置する入力ウィンドウを作成します。
- REST API リクエストを関数として作成します。
Option Explicit
Function WebRequest(Method As String, Command As String, Body As String) As String
Dim TCRequestItem As Object
Dim baseURL As String
Dim URL As String
Dim MAPI_Key As Variant
Set TCRequestItem = CreateObject("WinHttp.WinHttpRequest.5.1")
'SetTimeouts(resolveTimeout, ConnectTimeout, SendTimeout, ReceiveTimeout)
TCRequestItem.SetTimeouts 200000, 200000, 200000, 200000
baseURL = Cells(2, 7).Value
MAPI_Key = Cells(3, 7).Value
URL = baseURL & Command
TCRequestItem.Open Method, URL, False
TCRequestItem.SetRequestHeader "Content-type", "application/json"
TCRequestItem.SetRequestHeader "MAPI-Key", MAPI_Key
TCRequestItem.Send Body
WebRequest = TCRequestItem.ResponseText
Debug.Print Command & " : " & TCRequestItem.Status & " - " & TCRequestItem.StatusText
End Function
- 単純梁を生成するためのサブモジュールを作成します。
Sub CreateSimpleBeam()
Dim i, j, k As Integer
'input data from sheets
Dim dist As String
Dim force As String
Dim length As Double
Dim height As Double
Dim width As Double
Dim direction As String
Dim loadValue As Double
Dim modelID As Range
Dim loadCase As Range
Dim matSt As String
Dim matDB As String
dist = UCase(Cells(5, "E").Value)
force = UCase(Cells(6, "E").Value)
length = Cells(8, "E").Value
height = Cells(9, "E").Value
width = Cells(10, "E").Value
direction = Cells(9, "I").Value
loadValue = Cells(9, "J").Value
matSt = Cells(5, "J").Value
matDB = Cells(6, "J").Value
Set loadCase = Range(Cells(12, "I"), Cells(13, "J"))
Set modelID = Range(Cells(12, "E"), Cells(15, "E"))
'Dictionary
Dim dicMain As Scripting.Dictionary
Dim dicSub1 As Scripting.Dictionary
Dim dicSub2 As Scripting.Dictionary
Dim dicSub3 As Scripting.Dictionary
Dim dicSub4 As Scripting.Dictionary
Dim response As String
Dim body As String
'Create New File
response = WebRequest("POST", "/doc/new", "{}")
Debug.Print response
'Create Unit Body and Request API
Set dicMain = New Dictionary
Set dicSub1 = New Dictionary: Set dicSub2 = New Dictionary
dicSub2.Add "DIST", dist
dicSub2.Add "FORCE", force
dicSub1.Add "1", dicSub2
dicMain.Add "Assign", dicSub1
body = JsonConverter.ConvertToJson(dicMain)
response = WebRequest("PUT", "/db/unit", body)
Debug.Print response
Set dicMain = Nothing
Set dicSub1 = Nothing: Set dicSub2 = Nothing
'Create Material Body and Request API
Set dicMain = New Dictionary: Set dicSub1 = New Dictionary
Set dicSub2 = New Dictionary: Set dicSub3 = New Dictionary
dicSub3.Add "P_TYPE", 1
dicSub3.Add "STANDARD", matSt
dicSub3.Add "DB", matDB
dicSub2.Add "TYPE", "CONC"
dicSub2.Add "NAME", matDB
dicSub2.Add "PARAM", Array(dicSub3)
dicSub1.Add modelID(1, 1), dicSub2
dicMain.Add "Assign", dicSub1
body = JsonConverter.ConvertToJson(dicMain)
response = WebRequest("POST", "/db/matl", body)
Debug.Print response
Set dicMain = Nothing: Set dicSub1 = Nothing
Set dicSub2 = Nothing: Set dicSub3 = Nothing
'Create Section Body and Request API
Set dicMain = New Dictionary: Set dicSub1 = New Dictionary
Set dicSub2 = New Dictionary: Set dicSub3 = New Dictionary: Set dicSub4 = New Dictionary
dicSub4.Add "vSIZE", Array(height, width)
dicSub3.Add "USE_SHEAR_DEFORM", True
dicSub3.Add "SHAPE", "SB"
dicSub3.Add "DATATYPE", 2
dicSub3.Add "SECT_I", dicSub4
dicSub2.Add "SECTTYPE", "DBUSER"
dicSub2.Add "SECT_NAME", "Rectangular"
dicSub2.Add "SECT_BEFORE", dicSub3
dicSub1.Add modelID(2, 1), dicSub2
dicMain.Add "Assign", dicSub1
body = JsonConverter.ConvertToJson(dicMain)
response = WebRequest("POST", "/db/sect", body)
Debug.Print response
Set dicMain = Nothing: Set dicSub1 = Nothing
Set dicSub2 = Nothing: Set dicSub3 = Nothing: Set dicSub4 = Nothing
'Create Node Body and Request API
Set dicMain = New Dictionary: Set dicSub1 = New Dictionary
Dim num_division As Long
Dim interval As Double
num_division = 20
interval = length / num_division
For i = 0 To num_division
Set dicSub2 = New Dictionary
dicSub2.Add "X", i * interval
dicSub2.Add "Y", 0
dicSub2.Add "Z", 0
dicSub1.Add modelID(3, 1) + i, dicSub2
Set dicSub2 = Nothing
Next i
dicMain.Add "Assign", dicSub1
body = JsonConverter.ConvertToJson(dicMain)
response = WebRequest("POST", "/db/node", body)
Debug.Print response
Set dicMain = Nothing: Set dicSub1 = Nothing
'Create Element Body and Request API
Set dicMain = New Dictionary: Set dicSub1 = New Dictionary
For i = 0 To num_division
Set dicSub2 = New Dictionary
dicSub2.Add "TYPE", "BEAM"
dicSub2.Add "MATL", modelID(1, 1)
dicSub2.Add "SECT", modelID(2, 1)
dicSub2.Add "NODE", Array(modelID(3, 1) + i, modelID(3, 1) + i + 1)
dicSub1.Add modelID(4, 1) + i, dicSub2
Set dicSub2 = Nothing
Next i
dicMain.Add "Assign", dicSub1
body = JsonConverter.ConvertToJson(dicMain)
response = WebRequest("POST", "/db/elem", body)
Debug.Print response
Set dicMain = Nothing: Set dicSub1 = Nothing
'Create Boundary Body and Request API
Set dicMain = New Dictionary: Set dicSub1 = New Dictionary
Set dicSub2 = New Dictionary: Set dicSub3 = New Dictionary
dicSub3.Add "ID", 1
dicSub3.Add "CONSTRAINT", "1111000"
dicSub2.Add "ITEMS", Array(dicSub3)
dicSub1.Add modelID(3, 1), dicSub2
Set dicSub2 = Nothing: Set dicSub3 = Nothing
Set dicSub2 = New Dictionary: Set dicSub3 = New Dictionary
dicSub3.Add "ID", 1
dicSub3.Add "CONSTRAINT", "0111000"
dicSub2.Add "ITEMS", Array(dicSub3)
dicSub1.Add modelID(3, 1) + num_division, dicSub2
dicMain.Add "Assign", dicSub1
body = JsonConverter.ConvertToJson(dicMain)
response = WebRequest("POST", "/db/cons", body)
Debug.Print response
Set dicMain = Nothing: Set dicSub1 = Nothing
Set dicSub2 = Nothing: Set dicSub3 = Nothing
'Create Load Cases and Request API
Set dicMain = New Dictionary: Set dicSub1 = New Dictionary
For i = 0 To loadCase.Rows.Count - 1
Set dicSub2 = New Dictionary
dicSub2.Add "NAME", loadCase(i + 1, 2)
dicSub2.Add "TYPE", "USER"
dicSub1.Add i + 1, dicSub2
Set dicSub2 = Nothing
Next i
dicMain.Add "Assign", dicSub1
body = JsonConverter.ConvertToJson(dicMain)
response = WebRequest("POST", "/db/stld", body)
Debug.Print response
Set dicMain = Nothing: Set dicSub1 = Nothing
'Create Self-Weight Load Body and Request API
Set dicMain = New Dictionary: Set dicSub1 = New Dictionary
Set dicSub2 = New Dictionary
dicSub2.Add "LCNAME", loadCase(1, 2)
dicSub2.Add "FV", Array(0, 0, -1)
dicSub1.Add "1", dicSub2
dicMain.Add "Assign", dicSub1
body = JsonConverter.ConvertToJson(dicMain)
response = WebRequest("POST", "/db/bodf", body)
Debug.Print response
Set dicMain = Nothing: Set dicSub1 = Nothing
Set dicSub2 = Nothing
'Create Beam Load Body and Request API
Set dicMain = New Dictionary: Set dicSub1 = New Dictionary
For i = 0 To num_division - 1
Set dicSub2 = New Dictionary: Set dicSub3 = New Dictionary
dicSub3.Add "ID", 1
dicSub3.Add "LCNAME", loadCase(2, 2)
dicSub3.Add "CMD", "BEAM"
dicSub3.Add "TYPE", "UNILOAD"
dicSub3.Add "DIRECTION", direction
dicSub3.Add "D", Array(0, 1)
dicSub3.Add "P", Array(loadValue, loadValue)
dicSub2.Add "ITEMS", Array(dicSub3)
dicSub1.Add modelID(4, 1) + i, dicSub2
Set dicSub2 = Nothing: Set dicSub3 = Nothing
Next i
dicMain.Add "Assign", dicSub1
body = JsonConverter.ConvertToJson(dicMain)
response = WebRequest("POST", "/db/bmld", body)
Debug.Print response
Set dicMain = Nothing: Set dicSub1 = Nothing
'Create Load Combinations Body and Request API
Set dicMain = New Dictionary: Set dicSub1 = New Dictionary
Set dicSub2 = New Dictionary
Dim vCOMB() As Object
ReDim vCOMB(loadCase.Rows.Count - 1)
For i = 0 To loadCase.Rows.Count - 1
Set dicSub3 = New Dictionary
dicSub3.Add "ANAL", "ST"
dicSub3.Add "LCNAME", loadCase(i + 1, 2)
dicSub3.Add "FACTOR", loadCase(i + 1, 1)
Set vCOMB(i) = dicSub3
Set dicSub3 = Nothing
Next i
dicSub2.Add "NAME", "Comb1"
dicSub2.Add "ACTIVE", "ACTIVE"
dicSub2.Add "iTYPE", 0
dicSub2.Add "vCOMB", vCOMB
dicSub1.Add "1", dicSub2
dicMain.Add "Assign", dicSub1
body = JsonConverter.ConvertToJson(dicMain)
response = WebRequest("POST", "/db/lcom-gen", body)
Debug.Print response
Set dicMain = Nothing: Set dicSub1 = Nothing
Set dicSub2 = Nothing
End Sub
- 先ほど作成したサブモジュールを実行するボタンを作成します。[開発] タブからボタンを選択します。(開発ツールは、[リボンのカスタマイズ] 設定の [Excel オプション] で有効にできます。)
- 適切な場所にボタンを作成すると、利用可能なマクロ モジュールが下に表示されます。事前に挿入されたサブモジュールを選択して適用します。
- MIDAS CIVIL NX を実行し、API サーバーに接続し、API 設定にベース URL/MAPI キーを入力して、ボタンを実行します。
上記の手順を完了した添付ファイルを参照してください。
これで、MIDAS CIVIL NX で目的の構造が作成されました。
追加のVBAの例
Excel の VBA を使用した PC桁橋
この PC桁橋は、韓国の高速道路橋梁設計基準に基づいて Excel VBA を利用して作成した例です。
構造エンジニアのための最高のツール
VBA は、作成した Excel 構造計算シートと統合することで、最大の威力を発揮します。
特に、計算シートに解析結果を繰り返し入力する場合は、API が最適です。
VBA から始まる MIDAS Open API への第一歩を踏み出していただければ幸いです。